package com.idis.service;

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.idis.common.dictionary.WorkType;
import com.idis.entity.Work;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpMethod;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by Ming on 2018/1/29.
 */

/**
 * 作品服务
 */
@Service
public class WorkService{
    @Autowired
    RestTemplate restTemplate;

    @Autowired
    String DBUrl;

    private final String WORK ="/work";

    private final String FIND_ALL="/all";

    private final String SAVE="/save";

    private final String UPDATE_NOT_NULL="/updatenotnull";

    private final String UPDATE="/update";

    private final String FIND_BY_PROP="/findbyproperty";

    private final String FIND_BY_TYPE="/findbytype";

    private final String FIND_LIKE_NAME="/findlikename";

    private final String DELETE="/delete";

    /**
     * 获取所有作品信息
     * @return 作品信息集
     */
    public List<Work> findAll(){
        List<Work> works;
        works = restTemplate.exchange(DBUrl+WORK+FIND_ALL, HttpMethod.GET, null, new ParameterizedTypeReference<ArrayList<Work>>(){}).getBody();
        return works;
    }
    /**
     * 插入新作品记录
     * @param work 作品
     * @return 成功插入的数量
     */
    public Integer savaWork(Work work){
        return restTemplate.postForObject(DBUrl+WORK+SAVE,work,Integer.class);
    }

    /**
     * 更新作品，ID必须
     * @param work 作品
     * @return 成功更新的数量
     */
    public Integer update(Work work){
        return restTemplate.postForObject(DBUrl+WORK+UPDATE,work,Integer.class);
    }

    /**
     * 删除作品
     * @param work 作品信息，ID必需
     * @return 成功删除的数量
     */
    public Integer delete(Work work){
        return restTemplate.postForObject(DBUrl+WORK+DELETE,work,Integer.class);
    }

    /**
     * 更新作品，仅更新非空属性，ID必需
     * @param work 作品信息，ID必需
     * @return 成功更新的数量
     */
    public Integer updateNotNull(Work work){
        return restTemplate.postForObject(DBUrl+WORK+UPDATE_NOT_NULL,work,Integer.class);
    }

    /**
     * 根据examole有效属性值搜索作品，空信息无效
     * @param example 作品
     * @return 作品集
     */
    public List<Work> findByProperty(Work example){
        ArrayList<Work> works = null;
        String json= restTemplate.postForObject(DBUrl+WORK+FIND_BY_PROP,example,String.class);
        ObjectMapper objectMapper=new ObjectMapper();
        try {
            works =
                    objectMapper.readValue(json, new TypeReference<ArrayList<Work>>(){});
        } catch (IOException e) {
            e.printStackTrace();
        }
        return works;
    }

    /**
     * 获取作品类型及代号
     * @return [{代号:类型}]
     */
    public Map getRole(){
        Map roles=new HashMap();
        for (WorkType role: WorkType.values()) {
            roles.put(role.getCode(),role.getMessage());
        }
        return roles;
    }

    /**
     * 根据作品类型搜索作品
     * @param type 作品类型代号
     * @return 作品集
     */
    public List<Work> findByType(Integer type){
        List<Work> works= null;
        Work work = new Work();
        work.setType(type);
        works = findByProperty(work);
        return works;
    }

    /**
     * 根据作品ID搜索作品
     * @param id 作品ID
     * @return 作品集
     */
    public Work findById(long id){
        List<Work> works= null;
        Work work = new Work();
        work.setId(id);
        works = findByProperty(work);
        if(works!=null&&works.size()>0)
            return works.get(0);
        else
            return null;
    }

    /**
     * 根据作品名称模糊搜索作品
     * @param name 作品名称
     * @return 作品集
     */
    public List<Work> findLikeName(String name){
        Work work=new Work();
//        //通配符查询
//        work.setName("%"+name+"%");
        work.setName(name);
        List<Work> works = null;
        works = findByProperty(work);
        return works;
    }


}
